5. 값을 참조로 바꾸기

참조를 값으로 바꾸기(9.4)과 반대

  • 데이터를 갱신할 때, 하나라도 놓치면 데이터의 일관성이 깨질 때

(주의) A 객체의 수정으로 인한 사이드이펙트를 주의하자.

예시

고객 주문 데이터를 갱신할 때 해당 고객에 속한 주문 데이터들에 수정사항을 한번에 반영할 경우

절차


  1. 레코드의 유효범위가 제한적이라면 필드에 접근하는 모든 코드를 수정한 후 테스트를 한다. 이후 단계는 필요없다.
  2. 레코드가 캡슐화되지 않았다면 캡슐화
  3. 캡슐화된 객체안의 private 필드명을 변경하고, 그에 맞게 매서드 수정
  4. 테스트
  5. 생성자의 매개변수 중 필드와 이름이 겹치는 게 있다면 함수 선언 바꾸기로 변경한다.
  6. 접근자등의 이름도 바꿔준다.

예시 코드

😞 Before

class Order {
    constructor(data) {
        this._number = data.number
        this._customer = new Costomer(data.customerId)
    }

    get customer() {
    return this._customer
    }
}

class Costomer {
    constructor(id) {
    this._id = id
    }

    get id() {
    return this._id
    }
}

😃 After

class Order {
    constructor(data) {
        this._number = data.number
        this._customer = registerCustomer(data.customerId)
    }

    get customer() {
        return this._customer
    }
}

class Customer {
    constructor(id) {
        this._id = id
    }

    get id() {
        return this._id
    }
}

// 저장소 객체
let _repositoryData

export const initialize = () => {
    _repositoryData = {}
    _repositoryData.customer = new Map()
}

export const findCustomer = (id) => {
    return _repositoryData.customer.get(id)
}

export const registerCustomer = (id) => {
    if (!_repositoryData.customer.has(id)) {
        _repositoryData.customer.set(id, new Customer(id))
    }

    return findCustomer(id)
}

results matching ""

    No results matching ""